package com.cruise.game.service.order;

import com.cruise.game.model.param.order.AfterSalesParam;
import com.cruise.game.model.param.order.CreateOrderParam;
import com.cruise.game.model.param.order.RateOrderParam;
import com.cruise.game.model.vo.common.PageResult;
import com.cruise.game.model.vo.order.OrderDetailVO;
import com.cruise.game.model.vo.order.OrderListVO;

import java.util.List;

/**
 * 订单服务接口
 * 
 * @author cruise
 * @date 2025-02-28
 */
public interface OrderService {

    /**
     * 创建订单
     *
     * @param param 创建参数
     * @param userId 用户ID
     * @return 订单ID和订单编号
     */
    OrderCreationResult createOrder(CreateOrderParam param, Long userId);

    /**
     * 获取订单列表
     *
     * @param userId 用户ID
     * @param status 状态
     * @param page 页码
     * @param pageSize 每页条数
     * @return 订单列表
     */
    PageResult<OrderListVO> getUserOrderList(Long userId, String status, Integer page, Integer pageSize);

    /**
     * 获取订单详情
     *
     * @param orderId 订单ID
     * @param userId 用户ID
     * @return 订单详情
     */
    OrderDetailVO getUserOrderDetail(Long orderId, Long userId);

    /**
     * 取消订单
     *
     * @param orderId 订单ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean cancelOrder(Long orderId, Long userId);

    /**
     * 确认订单完成
     *
     * @param orderId 订单ID
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean confirmOrder(Long orderId, Long userId);

    /**
     * 申请售后
     *
     * @param orderId 订单ID
     * @param param 售后参数
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean applyAfterSales(Long orderId, AfterSalesParam param, Long userId);

    /**
     * 评价订单
     *
     * @param orderId 订单ID
     * @param param 评价参数
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean rateOrder(Long orderId, RateOrderParam param, Long userId);

    /**
     * 获取待接单列表
     *
     * @param gameCategoryId 游戏分类ID
     * @param page 页码
     * @param pageSize 每页条数
     * @return 订单列表
     */
    PageResult<OrderListVO> getPendingOrders(Long gameCategoryId, Integer page, Integer pageSize);

    /**
     * 代理接单
     *
     * @param orderId 订单ID
     * @param agentId 代理ID
     * @return 是否成功
     */
    boolean acceptOrder(Long orderId, Long agentId);

    /**
     * 开始服务
     *
     * @param orderId 订单ID
     * @param agentId 代理ID
     * @return 是否成功
     */
    boolean startService(Long orderId, Long agentId);

    /**
     * 完成服务
     *
     * @param orderId 订单ID
     * @param completionImageUrl 完成截图URL
     * @param agentId 代理ID
     * @return 是否成功
     */
    boolean completeService(Long orderId, String completionImageUrl, Long agentId);

    /**
     * 获取代理订单列表
     *
     * @param agentId 代理ID
     * @param status 状态
     * @param page 页码
     * @param pageSize 每页条数
     * @return 订单列表
     */
    PageResult<OrderListVO> getAgentOrderList(Long agentId, String status, Integer page, Integer pageSize);

    /**
     * 获取代理订单详情
     *
     * @param orderId 订单ID
     * @param agentId 代理ID
     * @return 订单详情
     */
    OrderDetailVO getAgentOrderDetail(Long orderId, Long agentId);

    /**
     * 获取最近订单
     *
     * @param limit 限制数量
     * @return 订单列表
     */
    List<RecentOrderVO> getRecentOrders(int limit);

    /**
     * 订单创建结果
     */
    class OrderCreationResult {
        private Long orderId;
        private String orderNumber;
        private java.math.BigDecimal price;

        public OrderCreationResult(Long orderId, String orderNumber, java.math.BigDecimal price) {
            this.orderId = orderId;
            this.orderNumber = orderNumber;
            this.price = price;
        }

        public Long getOrderId() {
            return orderId;
        }

        public String getOrderNumber() {
            return orderNumber;
        }

        public java.math.BigDecimal getPrice() {
            return price;
        }
    }

    /**
     * 最近订单VO
     */
    class RecentOrderVO {
        private String userNickname;
        private String serviceName;
        private String timeAgo;

        public RecentOrderVO(String userNickname, String serviceName, String timeAgo) {
            this.userNickname = userNickname;
            this.serviceName = serviceName;
            this.timeAgo = timeAgo;
        }

        public String getUserNickname() {
            return userNickname;
        }

        public String getServiceName() {
            return serviceName;
        }

        public String getTimeAgo() {
            return timeAgo;
        }
    }
}
